\chapter{实验设计思路}
\section{以深度值作为偏移值}
本文项目的目标模型为平面地图模型。该模型数据主要为基于同一水平表面的高度信息(通常在z轴方向)，因此为制作出具有高低模差异信息的置换题图，我们需要获取高模和低模的高度值，从而计算出二者的高度差。而在OpenGL渲染的过程中，三维模型被转化成了二维片段，模型顶点被执行了光栅化并在顶点数据之间发生了线性插值\cite{li2020differentiable}。相比于获取模型单一顶点坐标在z轴上的值，本文认为直接在片段着色器中获取片段的深度值，更能完整的得到模型各部分在z轴上的偏移信息。因此在实际的项目实现过程中，我们采用“深度”这个概念来替换“高度”，将二者的高度差计算转变为深度差计算，原本想要得到的高度贴图也就转化为了深度贴图。
\section{深度值获取}
具体的深度值是通过物体在坐标系z轴上的大小得到的。在转变为片段或者说屏幕上的像素前，输入OpenGL渲染管线的顶点会经过一系列的坐标变换，其中会涉及到数个变化矩阵。从局部坐标到世界坐标，需要Model模型矩阵；从世界坐标到观察坐标，需要View观察矩阵；从观察坐标到裁剪坐标，需要Projection投影矩阵。
\begin{figure}[ht]
    \centering
    \includegraphics[height=7cm]{images/坐标变换.png}
    \caption{坐标变换}
    \label{fig:my_label}
\end{figure}

在模型的所有顶点都转化到裁剪坐标系中后，OpenGL会启用透视除法，该算法使得三维模型被映射到平截头体中，从而导致OpenGL中的z值和深度产生非线性关系。基于这个原因，在高模和地膜上具有相同z值差的两组顶点，可能拥有不同的深度值。为了使z值和深度值恢复线性关系，有两种解决方案：

一是不在裁剪空间中，而是在观察空间中获取深度值。在计算过程中，不执行projection投影矩阵的计算，物体的z值便不会受到透视除法的影响。

二是根据透视除法的计算公式，反推出由FragCoord.z(当前片段对应的深度值)作为输入，计算线性深度值的公式。

为了尽量避免计算精度的不足导致的深度值误差增大，本文采取第一种做法。
\section{启用曲面细分}
在实验过程中本文发现，仅仅直接将高低模比较获取的偏移值作用在低模上，其效果会因为低模本身顶点数和面数的有限性而受到一定程度上的限制。因此本文决定采用曲面细分技术，在一定程度上增加低模的顶点数和面数，从而适当提高低模精度。
\section{总体思路}
综合以上信息，本文实验的总体思路如图所示：
\begin{figure}[ht]
    \centering
    \includegraphics[height=7cm]{images/实验思路.jpg}
    \caption{实验设计思路}
    \label{fig:my_label}
\end{figure}
首先由将高模和低模放入观察空间(而不是裁剪空间)中，计算高度差，生成高度贴图。然后低模单独进行曲面细分，增加模型顶点数和面数，提高模型精度。最后将较高精度的低模和高度贴图相结合，得到近似高模渲染效果的低模。